import re

from django.conf import settings

from utils.secret import SecretOauth
from .models import User
from django.contrib.auth.backends import ModelBackend

from meiduo_mall.settings.dev import logger


#  拼接向用户发送的url连接
def generate_verify_email_url(user):
    # 1, 构建加密的数据
    data = {"user_id": user.id, "email": user.email}
    # 2, 加密数据
    secret_data = SecretOauth().dumps(data)
    # 3, 拼接url
    verify_url = settings.EMAIL_VERIFY_URL + "?token=" + secret_data
    # 4, 返回数据
    return verify_url

"""
功能:
    在这里自定义djang的后台认证类,使之可以认证手机号
步骤:
    1, 定义类,继承自ModelBackend,
    2, 重写authenticate方法,
    3, 通过正则,判断username的类型,如果符合手机号 则使用mobile字段进行username的取值,
    4, 如果符合用户名, 则使用username字段进行username的取值,
    5, 判断取值的结果,如果不为空,则通过check_password方法进行校验
    6, 返回user对象
    7, 在设置中设置使用自己定义的认证系统
"""


# 封装校验多账号登录的方法
def get_user_by_account(username):
    try:
        # 通过正则,判断username的类型,如果符合手机号 则使用mobile字段进行username的取值
        if re.match("^1[345789]\d{9}$", username):
            user = User.objects.get(mobile=username)

        # 如果符合用户名, 则使用username字段进行username的取值
        else:
            user = User.objects.get(username=username)
    except Exception as e:
        logger.error(e)
        print("登录失败,用户不存在!!!")
        # 设置user为空
        user = None
    return user


class UsernameMobileAuthBackends(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 调用多账号登录的方法
        user = get_user_by_account(username)

        # 判断取值的结果,如果不为空,则通过check_password方法进行校验
        if user and user.check_password(password):
            return user
